package bliVideo
/**
 * https://www.bilibili.com/video/BV1wf4y1s7TG/?p=43
 * 43-异常处理与自定义异常
 * 抛出异常
 * 自定义异常
 * 异常处理
 */
fun main51() {
    fun checkOperation(num: Int?) {
        num ?: throw UnskilledException1("num = null!!")
    }
    var num: Int? = null
    var plus: Int? = null
    try {
        checkOperation(num)         //检查判空, 抛出异常
        plus = num!!.plus(1)  //走不到这1句
    } catch (e: UnskilledException1) {
        e.printStackTrace()
    }
    println("num = $num, plus = $plus")
}
//必须传入参数 s
private class UnskilledException1(s: String?) : IllegalArgumentException(s) {
}
//不能传入任何参数
private class UnskilledException2: IllegalArgumentException() {
}


/**
 * 44-先决条件函数
 * Kotlin标准库提供了一些便利函数，使用这些内置函数，你可以抛出带自定义信息的异常，
 * 这些便利函数叫做先决条件函数，你可以用它定义先决条件，条件必须满足目标代码才能执行。
 *
 *      函数              参数类型        抛异常条件           异常类型                if不报错, 返回值
 * @see checkNotNull     value: T?      if(value) == null   IllegalStateException       value
 * @see require          value: Boolean if(value) == false  IllegalArgumentException    value
 * @see requireNotNull   value: T?      if(value) == null   IllegalArgumentException    value
 * @see error            message: Any   Any                 IllegalStateException     直接抛异常并输出错误信息
 * @see assert           value: Boolean if(value) == false  AssertionError            打上断言编译器标记
 */
fun main52() {
    val num: Int? = null
    val boo: Boolean = false
    val lng: Long = 123L
    //1.
    try { checkNotNull(num) } catch (e: IllegalStateException) { e.printStackTrace() }
    try {
        checkNotNull(num, lazyMessage = { "num is null 1!" })
    } catch (e: IllegalStateException) {
        e.printStackTrace()
    }
    try {
        checkNotNull(num) { "num is null 2!" }
    } catch (e: IllegalStateException) {
        e.printStackTrace()
    }

    //2.
    try {
        require(boo/*, lazyMessage*/)
    } catch (e: IllegalArgumentException) {
        e.printStackTrace()
    }
    try {
        requireNotNull(num)
    } catch (e: IllegalArgumentException) {
        e.printStackTrace()
    }
    try {
        error(lng)
    } catch (e: IllegalStateException) {
        e.printStackTrace()
    }
    try {
        assert(boo)
    } catch (e: AssertionError) {
        e.printStackTrace()
    }
}
